package practica1.ui.dialog;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import javax.swing.*;
import practica1.Practica1;
import practica1.language.Language;
import practica1.manejoExperimento.ManejoExperimento;
import practica1.util.JTextFieldNumerico;

/**
 * JDialog que permite crear un nuevo experimento
 * @author Miguel González - Ceura
 */
public class DialogNuevoExperimento  extends JDialog  {
    public static final int CANCELAR = 0;
    public static final int ACEPTAR = 1;
    
    private JTextField txtNombreExperimento;
    private JTextField txtRutaExperimento;
    private JTextField txtTipoBacteria;
    private JTextField txtNombreInvestigador;
    private JTextField txtProyectoInvestigacion;
    private JTextFieldNumerico txtNumDiasExperimento;
    private JTextFieldNumerico txtLimiteAlimentacionMaxima;
    private JComboBox lstUnidadesMedida;
    private JCheckBox chkGuardarBD;
    private JButton btnExaminarExperimento;
    private JLabel lblAviso;
    private int action = 0;
    
    private ArrayList<String> experimentosBD;
    
    /**
     * Constructor del JDialog
     * @param parent Frame sobre el que se localiza
     */
    public DialogNuevoExperimento(Frame parent) {
        super(parent);
        
        init();
        
        setLocationRelativeTo(parent);
    }
    
    /**
     * Constructor del JDialog
     */
    public DialogNuevoExperimento() {
        super();
        
        init();
    }
    
    /**
     * Inicializa los componentes Swing
     */
    private void init() {
        experimentosBD = ManejoExperimento.obtenerExperimentosBD();
        
        Container contentPane = getContentPane();
        setSize(550, 300);
        setTitle(Language.getI().getP("NUEVO_EXPERIMENTO"));
        setModal(true);
        contentPane.setLayout(new BorderLayout());

        //Inicializamos los componentes Swing
        JLabel lblNombreExperimento = new JLabel(
                Language.getI().getP("NOMBRE_EXPERIMENTO"));
        txtNombreExperimento = new JTextField(15);
        txtNombreExperimento.addKeyListener(new CambioNombreExperimento());
        txtNombreExperimento.addActionListener(new PulsadoIntro());
        
        JLabel lblRutaExperimento = new JLabel(
                Language.getI().getP("RUTA_EXPERIMENTO"));
        txtRutaExperimento = new JTextField(15);
        txtRutaExperimento.setText(System.getProperty("user.home"));
        txtRutaExperimento.setEditable(false);
        txtRutaExperimento.setBackground(Color.WHITE);
        btnExaminarExperimento = new JButton(
                Language.getI().getP("EXAMINAR"));
        btnExaminarExperimento.addActionListener(new PulsadoExaminar());
        
        JLabel lblTipoBacteria = new JLabel(
                Language.getI().getP("TIPO_BACTERIA"));
        txtTipoBacteria = new JTextField(15);
        txtTipoBacteria.addActionListener(new PulsadoIntro());
        
        JLabel lblNombreInvestigador = new JLabel(
                Language.getI().getP("NOMBRE_INVESTIGADOR"));
        txtNombreInvestigador = new JTextField(15);
        txtNombreInvestigador.addActionListener(new PulsadoIntro());
        
        JLabel lblProyectoInvestigacion = new JLabel(
                Language.getI().getP("PROYECTO_INVESTIGACION"));
        txtProyectoInvestigacion = new JTextField(15);
        txtProyectoInvestigacion.addActionListener(new PulsadoIntro());
        
        JLabel lblNumDiasExperimento = new JLabel(
                Language.getI().getP("DURACION_EXPERIMENTO_DIAS"));
        txtNumDiasExperimento = new JTextFieldNumerico(15);
        txtNumDiasExperimento.addActionListener(new PulsadoIntro());
        
        JLabel lblLimiteAlimentacionMaxima = new JLabel(
                Language.getI().getP("ALIMENTACION_MAXIMA"));
        txtLimiteAlimentacionMaxima = new JTextFieldNumerico(15);
        txtLimiteAlimentacionMaxima.addActionListener(new PulsadoIntro());
        
        lstUnidadesMedida = new JComboBox(new String[]{
            Language.getI().getP("MILIGRAMOS"),
            Language.getI().getP("MICROGRAMOS")});
    
        
        lblAviso = new JLabel();
        lblAviso.setForeground(Color.RED);
        
        JButton btnAceptar = new JButton(Language.getI().getP("ACEPTAR"));
        btnAceptar.addActionListener(new PulsadoAceptar());
        JButton btnCancelar = new JButton(Language.getI().getP("CANCELAR"));
        btnCancelar.addActionListener(new PulsadoCancelar());
        
        chkGuardarBD = new JCheckBox(Language.getI().getP("GUARDAR_BD"));
        chkGuardarBD.addActionListener(new EscuchadorGuardarBD());
        
        //Si no hay conexión contra base de datos
        if(!ManejoExperimento.isConectado()) {
            chkGuardarBD.setEnabled(false);
            lblAviso.setText(Language.getI().getP("NO_HAY_CONEXION"));
        }
        
        //Panel superior
        JPanel panelSuperior = new JPanel();
        panelSuperior.add(new JLabel(
                Language.getI().getP("PROPIEDADES_EXPERIMENTO")));
        contentPane.add(panelSuperior, BorderLayout.NORTH);
        
        //Panel centro
        JPanel panelCentro = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.ipadx = 25;
        
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        panelCentro.add(lblNombreExperimento, c);
        c.gridx = 1;
        c.gridy = 0;
        c.gridwidth = 2;
        panelCentro.add(txtNombreExperimento, c);
        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 1;
        panelCentro.add(lblRutaExperimento, c);
        c.gridx = 1;
        c.gridy = 1;
        c.gridwidth = 2;
        panelCentro.add(txtRutaExperimento, c);
        c.gridx = 1;
        c.gridy = 2;
        c.gridwidth = 1;
        c.insets = new Insets(5,0,5,5); //Padding boton
        panelCentro.add(btnExaminarExperimento, c);
        c.gridx = 2;
        c.gridy = 2;
        c.insets = new Insets(0,0,0,0); //Restauramos el padding
        panelCentro.add(chkGuardarBD, c);
        c.gridx = 0;
        c.gridy = 3;
        c.gridwidth = 1;
        panelCentro.add(lblTipoBacteria, c);
        c.gridx = 1;
        c.gridy = 3;
        c.gridwidth = 2;
        panelCentro.add(txtTipoBacteria, c);
        c.gridx = 0;
        c.gridy = 4;
        c.gridwidth = 1;
        panelCentro.add(lblNombreInvestigador, c);
        c.gridx = 1;
        c.gridy = 4;
        c.gridwidth = 2;
        panelCentro.add(txtNombreInvestigador, c);
        c.gridx = 0;
        c.gridy = 5;
        c.gridwidth = 1;
        panelCentro.add(lblProyectoInvestigacion, c);
        c.gridx = 1;
        c.gridy = 5;
        c.gridwidth = 2;
        panelCentro.add(txtProyectoInvestigacion, c);
        c.gridx = 0;
        c.gridy = 6;
        c.gridwidth = 1;
        panelCentro.add(lblNumDiasExperimento, c);
        c.gridx = 1;
        c.gridy = 6;
        c.gridwidth = 2;
        panelCentro.add(txtNumDiasExperimento, c);
        c.gridx = 0;
        c.gridy = 7;
        c.gridwidth = 1;
        panelCentro.add(lblLimiteAlimentacionMaxima, c);
        c.gridx = 1;
        c.gridy = 7;
        panelCentro.add(txtLimiteAlimentacionMaxima, c);
        c.gridx = 2;
        c.gridy = 7;
        panelCentro.add(lstUnidadesMedida, c);
        contentPane.add(panelCentro, BorderLayout.CENTER);

        //Panel inferior
        JPanel panelInferior = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        panelInferior.add(lblAviso);
        panelInferior.add(btnCancelar);
        panelInferior.add(btnAceptar);
        contentPane.add(panelInferior, BorderLayout.SOUTH);
    }

    /**
     * Devuelve el nombre del experimento
     * @return String nombreExperimento
     */
    public String getNombreExperimento() {
        return txtNombreExperimento.getText();
    }

    /**
     * Devuelve la ruta del experiment
     * @return String rutaExperimento
     */
    public String getRutaExperimento() {
        return txtRutaExperimento.getText();
    }
    
    /**
     * Devuelve el tipo de bacteria
     * @return String tipoBacteria
     */
    public String getTipoBacteria() {
        return txtTipoBacteria.getText();
    }
    
    /**
     * Devuelve el nombre del investigador
     * @return String nombreInvestigador
     */
    public String getNombreInvestigador() {
        return txtNombreInvestigador.getText();
    }

    /**
     * Devuelve el proyecto de investigación
     * @return String proyectoInvestigacion
     */
    public String getProyectoInvestigacion() {
        return txtProyectoInvestigacion.getText();
    }    
    
    public int getNumDiasExperimento() {
        return Integer.parseInt(txtNumDiasExperimento.getText());
    }
    
    public int getLimiteAlimentacionMaxima() {
        return Integer.parseInt(txtLimiteAlimentacionMaxima.getText());
    }
    
    public String getUnidadesMedida() {
        return lstUnidadesMedida.getSelectedItem().toString();
    }
    
    public boolean isGuardarBD() {
        return chkGuardarBD.isSelected();
    }
    
    /**
     * Devuelve la acción realizada
     * @return int action
     */
    public int getAction() {
        return action;
    }
    
    /**
     * Evento producido al tippear el nombre del experimento y comprueba si
     * ya existe
     */
    private class CambioNombreExperimento extends KeyAdapter {
        @Override
        public void keyTyped(KeyEvent e) {
            //Comprobamos si el experimento existe en la ruta dada
            String rutaCompleta;
            
            if(e.getModifiers() == 0) {
                //Controlamos si borramos
                if((int)e.getKeyChar() == 8) {
                    if(txtNombreExperimento.getText().isEmpty()) {
                        rutaCompleta = "";
                    } else {
                        rutaCompleta = txtNombreExperimento.getText();
                    }
                } else if((int)e.getKeyChar() == 10) {
                    //Si pulsamos intro no hacemos nada
                    rutaCompleta = txtNombreExperimento.getText();
                }
                else {
                    rutaCompleta =  txtNombreExperimento.getText() + e.getKeyChar();
                }
            } else {
                //No se ha introducido texto, no añadimos el caracter
                if(txtNombreExperimento.getText().isEmpty()) {
                    rutaCompleta = "";
                } else {
                    rutaCompleta = txtNombreExperimento.getText();
                }
            }
            
            if(!chkGuardarBD.isSelected()) {
                if(!rutaCompleta.isEmpty()) {
                    rutaCompleta = txtRutaExperimento.getText() + "/" + rutaCompleta;
                }
            }

            comprobarNombre(rutaCompleta);
        }
    }
    
    private void comprobarNombre(String rutaCompleta) {
        if(!rutaCompleta.isEmpty() && !chkGuardarBD.isSelected() &&
                new File(rutaCompleta).exists()) {
            lblAviso.setText(Language.getI().getP("EXPERIMENTO_YA_EXISTE"));
        } else if(rutaCompleta.isEmpty()) {
            lblAviso.setText(Language.getI().getP("NOMBRE_NO_PUEDE_VACIO"));
        } else if(chkGuardarBD.isSelected() && !rutaCompleta.isEmpty() &&
                experimentosBD.contains(rutaCompleta)) {
            lblAviso.setText(Language.getI().getP("EXPERIMENTO_YA_EXISTE"));
        } else {
            lblAviso.setText("");
        }
    }
    
    /**
     * Evento producido al pulsar aceptar
     */
    private class PulsadoAceptar implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            aceptarAccion();
        }
    }
    
    /**
     * Accion producida al aceptar la acción
     */
    private void aceptarAccion() {
        if(estanTextosIntroducidos()) {
            if(lblAviso.getText().isEmpty()) {
                action = ACEPTAR;
                setVisible(false);
            }
        } else {
            JOptionPane.showMessageDialog(Practica1.getInstance(),
                Language.getI().getP("FALTAN_DATOS"), 
                Language.getI().getP("ADVERTENCIA"),
                JOptionPane.WARNING_MESSAGE);
        }
    }
    
    /**
     * Evento que se produce al pulsar cancelar
     */
    private class PulsadoCancelar implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            action = CANCELAR;
            setVisible(false);
        }
    }
    
    /**
     * Evento que se produce al pulsar examinar
     */
    private class PulsadoExaminar implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            JFileChooser fc = new JFileChooser();
            //Solo permitimos mostrar directorios
            fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            fc.setDialogTitle(Language.getI().getP("RUTA_EXPERIMENTO"));
            fc.setCurrentDirectory(new File(txtRutaExperimento.getText()));
            //Mostramos la ventana y obtenemos su respuesta
            int res = fc.showOpenDialog(null);

            if(res == JFileChooser.APPROVE_OPTION) {
                //Crear un objeto File la ruta elegida
                File rutaElegida = fc.getSelectedFile();
                //Mostramos la ruta elegida
                txtRutaExperimento.setText(rutaElegida.getAbsolutePath());

                //Comprobamos la nueva ruta
                if(!txtNombreExperimento.getText().isEmpty()) {
                    String nuevaRuta = txtRutaExperimento.getText() + "/" +
                            txtNombreExperimento.getText();
                    if(new File(nuevaRuta).exists()) {
                        lblAviso.setText(
                                Language.getI().getP("EXPERIMENTO_YA_EXISTE"));  
                    } else {
                        lblAviso.setText("");
                    }
                }
            }
        }
    }
    
    private class EscuchadorGuardarBD implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(chkGuardarBD.isSelected()) {
                txtRutaExperimento.setEnabled(false);
                btnExaminarExperimento.setEnabled(false);
                comprobarNombre(txtNombreExperimento.getText());
            } else {
                txtRutaExperimento.setEnabled(true);
                btnExaminarExperimento.setEnabled(true);
                comprobarNombre(txtRutaExperimento.getText() + "/" +
                        txtNombreExperimento.getText());
            }
            
        }
    }
    
    /**
     * Evento que se produce al pulsar intro en un JTextField
     */
    private class PulsadoIntro implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            aceptarAccion();
        }
    }

    /**
     * Función que comprueba si están escritos todos los campos
     * @return Si están escritos todos los campos devuelve verdad, sino falso
     */
    private boolean estanTextosIntroducidos() {
        return (!txtNombreExperimento.getText().isEmpty() &&
                    !txtTipoBacteria.getText().isEmpty() &&
                    !txtNombreInvestigador.getText().isEmpty() &&
                    !txtProyectoInvestigacion.getText().isEmpty() &&
                    !txtNumDiasExperimento.getText().isEmpty() &&
                    !txtLimiteAlimentacionMaxima.getText().isEmpty());
    }
}
